package com.sun.jdk.date.jdk8after;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Calendar;
import java.util.TimeZone;

public class Java8CalendarToZonedDateTimeDemo1 {

    /**
     * 二十八、Calendar转换为ZonedDateTime
     * Calendar对象字Java1.1开始提供了一个方法获取时区对象的方法，getTimeZone()，
     * 要将Calendar对象转换为ZonedDateTime需要先获取到时区对象TimeZone。
     * 从Java1.8开始TimeZone类提供了一个方法可以获取到ZonedId。获取到ZonedId之后就可以初始化ZonedDateTime对象了，
     * ZonedDateTime类有一个ofInstant()方法，可以将一个Instant对象和ZonedId对象作为参数传入构造一个ZonedDateTime对象。
     * <p>
     * 作者：一双看向未来的眼睛
     * 链接：https://www.jianshu.com/p/7a1b367ae95f
     * 来源：简书
     * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
     */
    private static void test1() {
        // 初始化一个Calendar对象
        Calendar calendar = Calendar.getInstance();
        // 通过Calendar对象获取时区
        TimeZone timeZone = calendar.getTimeZone();
        // 通过TimeZone获取ZondId
        ZoneId zoneId = timeZone.toZoneId();
        // 通过ZonedDateTime的ofInstant()方法获取ZonedDateTime
        ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(calendar.toInstant(), zoneId);
        LocalDateTime localDateTime = zonedDateTime.toLocalDateTime();

        System.out.println("calendar = " + calendar);
        System.out.println("timeZone = " + timeZone);
        System.out.println("zoneId = " + zoneId);
        System.out.println("zonedDateTime = " + zonedDateTime);
        System.out.println("localDateTime = " + localDateTime);
    }

    /**
     * 二十九、Calendar转换为LocalDateTime
     * java.util.Calendar类转换为java.time.LocalDateTime类
     * <p>
     * Calendar对象可以获取到年月日时分秒的信息，这些信息可以作为LocalDateTime构造方法的参数
     * <p>
     * 作者：一双看向未来的眼睛
     * 链接：https://www.jianshu.com/p/7a1b367ae95f
     * 来源：简书
     * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
     */
    private static void test2() {
        // Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
        Calendar calendar = Calendar.getInstance();
        int month = calendar.get(Calendar.MONTH);
        LocalDateTime localDateTime = LocalDateTime.of(calendar.get(Calendar.YEAR),
                month+1, // 这里要注意月份+1的问题
                calendar.get(Calendar.DAY_OF_MONTH),
                calendar.get(Calendar.HOUR_OF_DAY), // 这里要注意下12小时制和24小时制的问题
                calendar.get(Calendar.MINUTE),
                calendar.get(Calendar.SECOND));

        ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
        System.out.println("localDateTime = " + localDateTime);
        System.out.println("zonedDateTime = " + zonedDateTime);
    }

    private static void  test3(){
        ZonedDateTime zonedDateTime = ZonedDateTime.now();
        System.out.println("zonedDateTime = " + zonedDateTime);

        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println("localDateTime = " + localDateTime);

        LocalDateTime toLocalDateTime = zonedDateTime.toLocalDateTime();
        System.out.println("toLocalDateTime = " + toLocalDateTime);
    }

    public static void main(String[] args) {
        test1();
        System.out.println("-----");
        test2();
        System.out.println("---------");
        test3();
    }
}
